#ifndef __WIZ_BASE_TYPELIST_IMPL_HPP__SHANHAOBO_19800429__
#define __WIZ_BASE_TYPELIST_IMPL_HPP__SHANHAOBO_19800429__

#include "../Type/WizBaseType.hpp"

namespace Wiz
{
    namespace TypeList
    {
        namespace Impl
		{
			template <class HeadT, class TailT>
			struct Type
			{
				typedef HeadT   Self;
				typedef TailT   Next;
			}; /// end of struct Type
        }; /// end of namespace Impl
    } /// end of namespace TypeList
} /// end of namespace Wiz

#define WIZ_TYPELIST_1(T1) \
    ::Wiz::TypeList::Impl::Type<T1, ::Wiz::Null::Type>

#define WIZ_TYPELIST_2(T1, T2) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_1(T2)>

#define WIZ_TYPELIST_3(T1, T2, T3) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_2(T2, T3)>

#define WIZ_TYPELIST_4(T1, T2, T3, T4) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_3(T2, T3, T4)>

#define WIZ_TYPELIST_5(T1, T2, T3, T4, T5) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_4(T2, T3, T4, T5)>

#define WIZ_TYPELIST_6(T1, T2, T3, T4, T5, T6) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_5(T2, T3, T4, T5, T6)>

#define WIZ_TYPELIST_7(T1, T2, T3, T4, T5, T6, T7) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_6(T2, T3, T4, T5, T6, T7)>

#define WIZ_TYPELIST_8(T1, T2, T3, T4, T5, T6, T7, T8) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_7(T2, T3, T4, T5, T6, T7, T8)>

#define WIZ_TYPELIST_9(T1, T2, T3, T4, T5, T6, T7, T8, T9) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_8(T2, T3, T4, T5, T6, T7, T8, T9)>

#define WIZ_TYPELIST_10(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_9(T2, T3, T4, T5, T6, T7, T8, T9, T10)>

#define WIZ_TYPELIST_11(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_10(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)>

#define WIZ_TYPELIST_12(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_11(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)>

#define WIZ_TYPELIST_13(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_12(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)>

#define WIZ_TYPELIST_14(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_13(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)>

#define WIZ_TYPELIST_15(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_14(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>

#define WIZ_TYPELIST_16(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_15(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)>

#define WIZ_TYPELIST_17(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_16(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17)>

#define WIZ_TYPELIST_18(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_17(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18)>

#define WIZ_TYPELIST_19(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_18(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19)>

#define WIZ_TYPELIST_20(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_19(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20)>

#define WIZ_TYPELIST_21(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_20(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21)>

#define WIZ_TYPELIST_22(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_21(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22)>

#define WIZ_TYPELIST_23(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_22(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23)>

#define WIZ_TYPELIST_24(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_23(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24)>

#define WIZ_TYPELIST_25(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_24(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25)>

#define WIZ_TYPELIST_26(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_25(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26)>

#define WIZ_TYPELIST_27(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_26(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27)>

#define WIZ_TYPELIST_28(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_27(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28)>

#define WIZ_TYPELIST_29(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_28(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29)>

#define WIZ_TYPELIST_30(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30) \
    ::Wiz::TypeList::Impl::Type<T1, WIZ_TYPELIST_29(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30)>

#endif /*__WIZ_BASE_TYPELIST_IMPL_HPP__SHANHAOBO_19800429__*/
